package jdk6.compiler;

/**
 * Description: jdk1.6新特性：使用Compiler API（Compiler API） 可以用JDK6 的Compiler API(JSR
 * 199)去动态编译Java源文件，Compiler API结合反射功能就可以实现动态的产生Java代码并编译执行这些代码，有点动态语言的特征。
 * 这个特性对于某些需要用到动态编译的应用程序相当有用， 比如JSP Web Server，当我们手动修改JSP后，是不希望需要重启Web
 * Server才可以看到效果的， 这时候我们就可以用Compiler API来实现动态编译JSP文件，当然，现在的JSP Web
 * Server也是支持JSP热部署的， 现在的JSP Web
 * Server通过在运行期间通过Runtime.exec或ProcessBuilder来调用javac来编译代码，
 * 这种方式需要我们产生另一个进程去做编译工作，不够优雅而且容易使代码依赖与特定的操作系统； Compiler
 * API通过一套易用的标准的API提供了更加丰富的方式去做动态编译,而且是跨平台的。
 * 
 * 个人认为：很有用，感觉热部署的原理也是这个
 * @author Kwum
 * @date 2017年6月17日 下午3:09:25
 * @version 1.0
 */

public class Run {

    public static void main(String[] args) {
        System.out.println("JDK6的新特性：Compiler API! 可以动态编译Java源文件  下面是网络源码，这里并没有实现");
    }

}

//class CompilerAPITester {
//    private static String JAVA_SOURCE_FILE = "DynamicObject.java";
//    private static String JAVA_CLASS_FILE = "DynamicObject.class";
//    private static String JAVA_CLASS_NAME = "DynamicObject";
//
//    public static void main(String[] args) {
//        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
//        generateJavaClass();
//        try {
//            // 将产生的类文件拷贝到程序的ClassPath下面,下面这一行代码是特定于Windows＋IntelliJ IDEA
//            // 6.0项目,不具有移植性
//            Runtime.getRuntime().exec("cmd /c copy " + JAVA_CLASS_FILE + " classes\\production\\JDK6Features");
//            Iterable<? extends JavaFileObject> sourcefiles = fileManager.getJavaFileObjects(JAVA_SOURCE_FILE);
//            compiler.getTask(null, fileManager, null, null, null, sourcefiles).call();
//            fileManager.close();
//            Class.forName(JAVA_CLASS_NAME).newInstance();// 创建动态编译得到的DynamicObject类的实例
//        } catch (Exception ex) {
//            ex.printStackTrace();
//        }
//    }
//
//    public static void generateJavaClass() {
//        try {
//            FileWriter fw = new FileWriter(JAVA_SOURCE_FILE);
//            BufferedWriter bw = new BufferedWriter(fw);
//            bw.write("public class " + JAVA_CLASS_NAME + "{");
//            bw.newLine();
//            bw.write("public " + JAVA_CLASS_NAME + "(){System.out.println(\"In the constructor of DynamicObject\");}}");
//            bw.flush();
//            bw.close();
//        } catch (IOException ex) {
//            ex.printStackTrace();
//        }
//    }
//}
